package controlador;

import java.util.ArrayList;
import java.util.List;

import org.joda.time.LocalDate;

import dominio.Reserva;
import testData.DataCollections.*;
import utilitarios.Calendario;

public class ReservaControlador {

	private List<Reserva> reservas = new ArrayList<Reserva>();

	// CRUD de la Reserva
	public void crearReserva(Reserva reserva) {
		reservas.add(reserva);
	}

	public Reserva obtenerReserva(int codigo) {
		for (Reserva reserva : reservas) {
			if (reserva.getCodigo() == codigo) {
				return reserva;
			}
		}

		return null;
	}

	public void eliminarReserva(int codigo) {
		for (int i = 0; i < reservas.size(); i++) {
			Reserva r = reservas.get(i);

			if (codigo == r.getCodigo()) {
				reservas.remove(i);
			}
		}
	}

	public int estaReservada(int codHabitacion, LocalDate fecha) {
		for (Reserva reserva : reservas) {

			if ((codHabitacion == reserva.getHabitacion().getCodigo())) {
				if (Calendario.fechaEntre(fecha, reserva.getFechaLlegada(),
						reserva.getFechaSalida())) {
					return reserva.getCodigo();
				}
			}
		}
		return 0;
	}

	public int devolverCantidadReservas() {
		return reservas.size();
	}

	public List<Reserva> devolverListaReservas() {
		List<Reserva> lista = reservas;
		return lista;
	}

	public void cambiarEstadoReserva(int codigo, Estado estado) {
		for (Reserva reserva : reservas) {
			if (reserva.getCodigo() == codigo) {
				boolean cambiarEstado = false;

				Estado estadoActual = reserva.getEstado();

				// Validar si cambia estado de la reserva a "Confirmado"
				cambiarEstado = (estado.equals(Estado.CONFIRMADO) && estadoActual
						.equals(Estado.PENDIENTE)) ? true : cambiarEstado;

				// Validar si cambia estado de la reserva a "CheckIn"
				cambiarEstado = ((estado.equals(Estado.CHECKIN) && estadoActual
						.equals(Estado.CONFIRMADO)) && Calendario
						.esAntesOAhora(reserva.getFechaLlegada())) ? true
						: cambiarEstado;

				// Validar si cambia estado de la reserva a "CheckOut"
				cambiarEstado = (estado.equals(Estado.CHECKOUT) && estadoActual
						.equals(Estado.CHECKIN)) ? true : cambiarEstado;

				// Validar que el estado de la reserva a "CheckOut" este
				// bloqueado.
				if (estado.equals(Estado.PENDIENTE))
					if (estadoActual.equals(Estado.CHECKOUT))
						cambiarEstado = false;

				if (cambiarEstado) {
					reserva.setEstado(estado);
				}

				break;
			}
		}
	}
}
